#include <iostream>
using namespace std;

//————————————————  题目1  ————————————————
class A
{
public:
	virtual void func(int val = 1) { std::cout << "A->" << val << std::endl; }
	virtual void test() { func(); }  // this->func*()，由于this本质是A*,满足多态条件，那么就和A*没关系，调用的就是子类的func
};
class B : public A
{
public:
	void func(int val = 0) { std::cout << "B->" << val << std::endl; } // 重写虚函数的实现，因此用的是父类的接口（因此子类用不用venture都可以，重写的是实现）和子类自己的实现
};

void Test1()
{
	B* p = new B;
	p->test(); //相当于A中Test()接口是A的，括号是B的
}


//————————————————  题目2  ————————————————
class Base
{
public:
	virtual void Func1() //指针在32位下是四个字节，64位下位8个字节
	{
		cout << "Func1()" << endl;
	}
	virtual void Func2()
	{
		cout << "Func2()" << endl;
	}
	void Func3()
	{
		cout << "Func3()" << endl;
	}
private:
	int _b = 1; //四个字节
	char _ch = 'x'; //1个字节，补齐为四个字节
};

void Test2()
{
	cout << sizeof(Base) << endl; //12
	//因为要把虚函数放进虚函数表中，多了一个指针 -__vfptr	0xcccccccc {???, ???}void * *
	Base b;
}



int main()
{
	Test1();
	Test2();
	
	return 0;
}